package LinkedList;

/**
 * 反转链表，本题巧妙的运用了双指针的方法，本题核心在于temp节点，
 * 用于储存cur要遍历的下一个节点，因为正常来说翻转之后cur.next是前一个节点而不是后一个
 */
public class ReverseList {
    public static void main(String[] args) {
        ListNode node1=new ListNode(1);
        node1.next=new ListNode(2);
        node1.next.next=new ListNode(3);
        node1.next.next.next=new ListNode(4);
        node1.next.next.next.next=new ListNode(5);
        ReverseList solution=new ReverseList();
        ListNode last=solution.reverseList(node1);
        while(last.next!=null){
            System.out.println(last.val);
            last=last.next;
        }
    }
    public ListNode reverseList(ListNode head){
        ListNode cur=head;
        ListNode pre=null;
        ListNode temp=null;
        while(cur!=null){
            temp=cur.next; // 储存cur的下一个节点，因为马上的cur.next要往前面指
            cur.next=pre;// 这一步算是翻转，pre是cur的前一个节点
            pre=cur; // pre向后移动到cur的位置上
            cur=temp;// cur向后移动
        }
        return pre;
    }
}
